import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

# 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

def visualize_composite_limit_corrected():
    # 定义函数（修正版本）
    def g(x):
        return x**2  # 内层函数
    
    def f(u):
        """处理u=0的情况，当u=0时函数值为1（已知极限）"""
        # 对于标量输入
        if np.isscalar(u):
            return 1.0 if u == 0 else np.sin(u) / u
        # 对于数组输入
        else:
            result = np.sin(u) / u
            result[u == 0] = 1.0  # u=0处的极限值
            return result
    
    # 生成数据（避免除零错误）
    x_vals = np.linspace(-1, 1, 400)
    x_vals = x_vals[x_vals != 0]  # 排除x=0
    u_vals = g(x_vals)
    y_vals = f(u_vals)
    
    # 创建图形
    fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(16, 5))
    
    # 1. 内层函数 g(x) = x²
    ax1.plot(x_vals, u_vals, 'b-', linewidth=2, label=r'$g(x) = x^2$')
    ax1.axhline(y=0, color='r', linestyle='--', alpha=0.7, label=r'$u_0 = 0$')
    ax1.axvline(x=0, color='r', linestyle='--', alpha=0.7)
    ax1.set_xlabel('x', fontsize=12)
    ax1.set_ylabel('g(x)', fontsize=12)
    ax1.set_title('内层函数: 自变量 x → 中间变量 u', fontsize=14)
    ax1.legend(fontsize=10)
    ax1.grid(True, alpha=0.3)
    
    # 添加几个示例点的标注
    sample_x = [-0.8, -0.4, 0.4, 0.8]
    for x_val in sample_x:
        u_val = g(x_val)
        ax1.plot([x_val, x_val], [0, u_val], 'k:', alpha=0.5)
        ax1.plot([0, x_val], [u_val, u_val], 'k:', alpha=0.5)
        ax1.annotate(f'x={x_val:.1f}\nu={u_val:.2f}', 
                    xy=(x_val, u_val), xytext=(5, 5),
                    textcoords='offset points', fontsize=8)
    
    # 2. 外层函数 f(u) = sin(u)/u
    u_range = np.linspace(-0.3, 0.3, 200)
    f_u = f(u_range)
    
    ax2.plot(u_range, f_u, 'g-', linewidth=2, label=r'$f(u) = \frac{\sin u}{u}$')
    ax2.axhline(y=1, color='r', linestyle='--', alpha=0.7, label=r'$\lim_{u \to 0} f(u) = 1$')
    ax2.axvline(x=0, color='r', linestyle='--', alpha=0.7)
    ax2.set_xlabel('u', fontsize=12)
    ax2.set_ylabel('f(u)', fontsize=12)
    ax2.set_title('外层函数: 中间变量 u → 函数值 f(u)', fontsize=14)
    ax2.legend(fontsize=10)
    ax2.grid(True, alpha=0.3)
    
    # 标记内层函数输出的u值在f(u)上的对应点
    for x_val in sample_x:
        u_val = g(x_val)
        f_val = f(u_val)
        ax2.plot(u_val, f_val, 'bo', markersize=6)
        ax2.annotate(f'u={u_val:.2f}\nf={f_val:.3f}', 
                    xy=(u_val, f_val), xytext=(5, 5),
                    textcoords='offset points', fontsize=8)
    
    # 3. 复合函数 f(g(x)) = sin(x²)/x²
    ax3.plot(x_vals, y_vals, 'm-', linewidth=2, label=r'$f(g(x)) = \frac{\sin(x^2)}{x^2}$')
    ax3.axhline(y=1, color='r', linestyle='--', alpha=0.7, label=r'$\lim_{x \to 0} f(g(x)) = 1$')
    ax3.axvline(x=0, color='r', linestyle='--', alpha=0.7)
    ax3.set_xlabel('x', fontsize=12)
    ax3.set_ylabel('f(g(x))', fontsize=12)
    ax3.set_title('复合函数: 自变量 x → 最终函数值 f(g(x))', fontsize=14)
    ax3.legend(fontsize=10)
    ax3.grid(True, alpha=0.3)
    
    # 标记几个点显示复合过程
    for x_val in sample_x:
        u_val = g(x_val)
        f_val = f(u_val)
        ax3.plot(x_val, f_val, 'bo', markersize=6)
        ax3.annotate(f'x={x_val:.1f}\nf={f_val:.3f}', 
                    xy=(x_val, f_val), xytext=(5, 5),
                    textcoords='offset points', fontsize=8)
    
    plt.tight_layout()
    plt.show()
    
    # 理论解释
    print("复合函数极限的几何解释:")
    print("1. 当 x → 0 时，g(x) = x² → 0")
    print("2. 当 u = g(x) → 0 时，f(u) = sin(u)/u → 1")
    print("3. 因此，复合函数 f(g(x)) 在 x → 0 时也 → 1")
    print("4. 关键条件：在 x=0 的去心邻域内，g(x) = x² ≠ 0（满足复合函数极限定理条件）")

# 执行修正后的函数
visualize_composite_limit_corrected()
